/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import DTO.Aclaraciones;
import DTO.CodigoFuente;
import DTO.Concurso;
import DTO.Dudas;
import DTO.LenguajesConcurso;
import DTO.Reactivo;
import DTO.Rol;
import DTO.Servidor;
import DTO.Usuario;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author acazares
 */
public class UtilDao{
    
    protected Session sesion; 
    protected Transaction tx; 
    
    protected String objName;// = "Usuarios";
    protected String objAlias;// = "usuario";
    protected Object object;
    
    
    public UtilDao(){
        sesion = HibernateUtilDAO.getSessionFactory().openSession(); 
    }
    
    public UtilDao(tipos.ComponentesNombre tipo){        
        sesion = HibernateUtilDAO.getSessionFactory().openSession(); 
        System.out.println("UtilDao: Inicializando valores del objeto...");
        if(tipo == tipos.ComponentesNombre.Aclaraciones){
            objName=tipo.toString(); objAlias="aclaraciones"; object = new Aclaraciones();   
        }
        if(tipo == tipos.ComponentesNombre.CodigoFuente ){
            objName=tipo.toString(); objAlias="codigo_fuente"; object = new CodigoFuente();   
        }
        if(tipo == tipos.ComponentesNombre.Concurso ){
            objName=tipo.toString(); objAlias="concurso"; object = new Concurso();   
        }
        if(tipo == tipos.ComponentesNombre.Dudas){
            objName=tipo.toString(); objAlias="dudas"; object = new Dudas();   
        }
        if(tipo == tipos.ComponentesNombre.Lenguaje){
            objName=tipo.toString(); objAlias="lenguaje"; object = new DTO.Lenguaje();   
        }
        if(tipo == tipos.ComponentesNombre.LenguajeConcurso ){
            objName=tipo.toString(); objAlias="lenguajes_concurso"; object = new LenguajesConcurso();   
        }
        if(tipo == tipos.ComponentesNombre.Reactivo){
            objName=tipo.toString(); objAlias="reactivo"; object = new Reactivo();   
        }
        if(tipo == tipos.ComponentesNombre.Rol){
            objName=tipo.toString(); objAlias="rol"; object = new Rol();   
        }
        if(tipo == tipos.ComponentesNombre.Servidor){
            objName=tipo.toString(); objAlias="servidor"; object = new Servidor();   
        }
        if(tipo == tipos.ComponentesNombre.Usuario ){
            objName=tipo.toString(); objAlias="usuario"; object = new Usuario();   
        }
    }
    
    public List casting(List list){
        if(objName.equals(tipos.ComponentesNombre.Aclaraciones.toString() )){
            return (List<Aclaraciones>) list;
        }
        if(objName.equals(tipos.ComponentesNombre.CodigoFuente.toString() )){
            return (List<CodigoFuente>) list;
        }
        if(objName.equals(tipos.ComponentesNombre.Concurso.toString() )) {
            return (List<Concurso>) list;
        }
        if(objName.equals(tipos.ComponentesNombre.Dudas.toString() )) {
            return (List<Dudas>) list;
        }
        if(objName.equals(tipos.ComponentesNombre.Lenguaje.toString() )) {
            return (List<DTO.Lenguaje>) list;
        }
        if(objName.equals(tipos.ComponentesNombre.LenguajeConcurso.toString())){
            return (List<LenguajesConcurso>) list;
        }
        if(objName.equals(tipos.ComponentesNombre.Reactivo.toString() )) {
            return (List<Reactivo>) list;
        }
        if(objName.equals(tipos.ComponentesNombre.Rol.toString())) {
            return (List<Rol>) list;
        }
        if(objName.equals(tipos.ComponentesNombre.Servidor.toString())) {
            return (List<Servidor>) list;
        }
        if(objName.equals(tipos.ComponentesNombre.Usuario.toString())){
            return (List<Usuario>) list;
        }
        return (List<Object>) list;
    }
    
    
    public Object getById(String id){        
        try {
            tx = sesion.beginTransaction();
            System.out.println("FROM "+objName+" AS "+objAlias+" WHERE id='"+id+"'");
            Query q = sesion.createQuery ("FROM "+objName+" AS "+objAlias+" WHERE id='"+id+"'");
            
            //List objectList = (List<Concurso>) q.list();
            //objClass = objectList.size()>0?objectList.get(0):concurso;
            object = casting(q.list()).size()>0?casting(q.list()).get(0):object;
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            return object;
        }
    }
    
    
    //public List getList() {
    public List getList() {
        //List<Usuario> usersList = null;               
        List objList = null;
        try {
            tx = sesion.beginTransaction();
            Query q = sesion.createQuery ("from "+objName+" as "+objAlias);
            objList = (List) q.list();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return objList;
    }
    
    
    
    
    public String guardar(Object obj) throws HibernateException {         
        String id = "";  
        try { 
            tx = sesion.beginTransaction(); 
            id = (String) sesion.save(obj); 
            tx.commit(); 
        } catch (Exception e) {             
            System.err.append("insert error: "+e);
        } finally { 
            sesion.close(); 
            return id;
        }           
    }
    //alias [guardar]
    public String insert(Object obj) throws HibernateException {         
        String id = "";  
        try { 
            tx = sesion.beginTransaction(); 
            id = (String) sesion.save(obj); 
            tx.commit(); 
        } catch (Exception e) {             
            System.err.append("insert error: "+e);
        } finally { 
            sesion.close(); 
            return id;
        }           
    }
    
    
    public void update(Object obj){
        try {
            tx = sesion.beginTransaction();
            sesion.update(obj);
            tx.commit();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    
    public int count(String from){
        try {
            tx = sesion.beginTransaction();
            return sesion.createQuery("from "+from).list().size();
        }catch (Exception e) {            
            e.printStackTrace();
            return 0;
        }
    }
    
    
    
}